/**
 * Project  : Looker
 * Package  : net.freestu.looker.monitor
 * File     : ModifyDispatcher.java
 * Author   : solosky < solosky772@qq.com >
 * Date     : Aug 27, 2009
 * Modified : Aug 27, 2009
 * License  : Apache License 2.0 
 */
package net.freestu.looker.monitor;

import java.util.ArrayList;
import java.util.Iterator;

import net.freestu.looker.common.ListenerException;
import net.freestu.looker.common.Media;
import net.freestu.looker.common.MediaListener;
import net.freestu.looker.common.NewsEntity;
import net.freestu.looker.common.NewsListener;
import net.freestu.looker.common.NewsMeta;

import org.apache.log4j.Logger;

/**
 *  更改分发器
 *  由检查器检查出新闻更改，然后把更改交给更改分发器分发处理
 *  管理了新闻和附件监听器
 */
public class ModifyDispatcher
{
	/**
	 * 新闻监听器列表
	 */
	private ArrayList<NewsListener> newsListenerList;
	
	/**
	 * 新闻附件监听器列表
	 */
	private ArrayList<MediaListener> mediaListenerList;
	
	/**
	 * 日志记录
	 */
	private static Logger logger = Logger.getLogger(ModifyDispatcher.class);
	/**
	 * 单例对象
	 */
	private static ModifyDispatcher instance = new ModifyDispatcher();
	
	/**
	 * 构造函数
	 */
	private ModifyDispatcher()
	{
		newsListenerList  = new ArrayList<NewsListener>();
		mediaListenerList = new ArrayList<MediaListener>(); 
	}
	
	/**
	 * 返回单例对象
	 */
	public  static ModifyDispatcher getInstance()
	{
		return instance;
	}
	
	/**
	 * 注册新闻监听器
	 */
	public void registerNewsListener(NewsListener listener)
	{
		newsListenerList.add(listener);
	}
	
	/**
	 * 注册附件监听器
	 */
	public void registerMediaListener(MediaListener listener)
	{
		mediaListenerList.add(listener);
	}
	
	//////////////////////////////////////////////////////////
	/**
	 * 添加了一个新闻
	 */
	public synchronized void newsAdded(NewsEntity newsEntity)
	{
        //先通知所有新闻监听器
        Iterator<NewsListener> nit = newsListenerList.iterator();
        NewsListener newsListener = null;
        while(nit.hasNext()) {
	        try {
	        	newsListener = nit.next(); 
	            newsListener.add(newsEntity);
	            newsListener.commit();
            } catch (ListenerException e) {
	           logger.warn("添加新闻时新闻监听器错误:"+e);
            }
        }
        
        //通知所有附件监听器
            Iterator<MediaListener> mit = mediaListenerList.iterator();
            while(mit.hasNext()) {
    	        try {
    	            MediaListener ml = mit.next();
    	            Iterator<Media> tit = newsEntity.getMediaList().iterator();
    	          //发送所有附件至附件监听器
    	            while(tit.hasNext())
    	            	ml.add(tit.next());
    	            //提交更改
    	            ml.commit();
                } catch (ListenerException e) {
    	           logger.warn("添加附件时附件监听器错误:"+e);
                }
            }
	}
	
	/**
	 * 删除一个新闻
	 */
	public synchronized void newsDeleted(NewsMeta newsMeta)
	{
		//先删除新闻
        Iterator<NewsListener> nit = newsListenerList.iterator();
        while(nit.hasNext()) {
	        try {
	            nit.next().delete(newsMeta);
            } catch (ListenerException e) {
	           logger.warn("删除新闻时新闻监听器错误:"+e);
            }
        }
        
        //删除附件
        Iterator<MediaListener> mit = mediaListenerList.iterator();
        while(mit.hasNext()) {
	        try {
	            MediaListener ml = mit.next();
	            Media tmpMedia = null;
	            Iterator<String> tit = newsMeta.getMediaHashList().iterator();
	            while(mit.hasNext()) {
	            	tmpMedia = new Media();
	            	tmpMedia.setHash(tit.next());
	            	ml.delete(tmpMedia);
	            }
            } catch (ListenerException e) {
	           logger.warn("删除附件时附件监听器错误:"+e);
            }
        }
       
	}
	
	/**
	 * 更新了一个新闻
	 */
	public synchronized void newsUpdated(NewsEntity newsEntity)
	{
        //先通知所有新闻监听器
        Iterator<NewsListener> nit = newsListenerList.iterator();
        while(nit.hasNext()) {
	        try {
	            nit.next().update(newsEntity);
            } catch (ListenerException e) {
	           logger.warn("更新新闻时新闻监听器错误:"+e);
            }
        }
        //通知所有附件监听器
        Iterator<MediaListener> mit = mediaListenerList.iterator();
        while(mit.hasNext()) {
	        try {
	            MediaListener ml = mit.next();
	            Iterator<Media> tit = newsEntity.getMediaList().iterator();
	            while(tit.hasNext())
	            	ml.update(tit.next());
	            //发送所有附件至附件监听器
            } catch (ListenerException e) {
	           logger.warn("更新附件时附件监听器错误:"+e);
            }
        }  
	}
}
